/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package control;

import control.comparaciones.ComparacionIniciaCon;
import control.filtros.Filtro;
import control.filtros.FiltroCargosNombre;
import control.filtros.FiltroDepartamentoNombre;
import control.filtros.FiltroEmpleadoCedula;
import control.filtros.FiltroEmpleadoNombre;
import control.filtros.FiltroPrestacionesNombre;
import entidad.Bono;
import entidad.CambiosCargos;
import entidad.CambiosEmpleado;
import entidad.CambiosPrestacion;
import entidad.Cargo;
import entidad.Empleado;
import entidad.Falla;
import entidad.HoraExtra;
import entidad.Prestacion;
import frontera.interfaz.Tupla;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;

/**
 *
 * @author Sebastian
 */
public class AdministrarCambios {
  
    public boolean verificarFecha(Calendar fecha1,Calendar fecha2){
        return (    fecha1.get(Calendar.YEAR) ==    fecha2.get(Calendar.YEAR)&&
                    fecha1.get(Calendar.MONTH) ==   fecha2.get(Calendar.MONTH)&&
                    verificarQuincena(fecha1)==verificarQuincena(fecha2)        );
    }

    public ArrayList<Empleado> getEmpleadosFecha(Calendar fecha){
        
        ArrayList<Empleado> empleadosFecha = new ArrayList<Empleado>();
        ArrayList<CambiosEmpleado> cambiosEmp = SIRHApp.getInstance().getDAOCamEmpleado().getCambiosEmpleado();
        
        for(CambiosEmpleado cam: cambiosEmp){
            long ID = cam.getId();
            ArrayList<Empleado> cambiosID = SIRHApp.getInstance().getDAOEmpleado().getCambiosID(ID,fecha);
            if(cambiosID.size()>0){
                empleadosFecha.add(getEmpMayorFecha(cambiosID));
            }
        }
        return empleadosFecha;
    }

    public ArrayList<Prestacion> getPrestacionFecha(Calendar fecha){
         
        ArrayList<Prestacion> PrestacionsFecha = new ArrayList<Prestacion>();
        ArrayList<CambiosPrestacion> cambiosEmp = SIRHApp.getInstance().getDAOCamPrestacion().getCambiosPrestacion();
        
        for(CambiosPrestacion cam: cambiosEmp){
            long ID = cam.getId();
            ArrayList<Prestacion> cambiosID = SIRHApp.getInstance().getDAOPrestacion().getCambiosID(ID,fecha);
            if(cambiosID.size()>0){
                PrestacionsFecha.add(getPresMayorFecha(cambiosID));
            }
        }
        return PrestacionsFecha;
    }
    
    public ArrayList<Cargo> getCargosFecha(Calendar fecha){
         
        ArrayList<Cargo> CargosFecha = new ArrayList<Cargo>();
        ArrayList<CambiosCargos> cambiosEmp = SIRHApp.getInstance().getDAOCamCargo().getCambiosCargo();
        
        for(CambiosCargos cam: cambiosEmp){
            long ID = cam.getId();
            ArrayList<Cargo> cambiosID = SIRHApp.getInstance().getDAOCargo().getCambiosID(ID,fecha);
            if(cambiosID.size()>0){
                CargosFecha.add(getCarMayorFecha(cambiosID));
            }
        }
        return CargosFecha;
    }
    
    public int compararFecha(Calendar fecha1,Calendar fecha2){
        if( fecha1.get(Calendar.YEAR) ==fecha2.get(Calendar.YEAR)){
            if(fecha1.get(Calendar.MONTH)==fecha2.get(Calendar.MONTH)){
                if(verificarQuincena(fecha1)==verificarQuincena(fecha2)){
                    return igual;
                }
                else if(verificarQuincena(fecha1)<verificarQuincena(fecha2)){
                    return menor;
                }
                else{
                    return mayor;
                }
            }
            else if(fecha1.get(Calendar.MONTH)<fecha2.get(Calendar.MONTH)){
                return menor;
            }
            else{
                return mayor;
            }
        }
        else if(fecha1.get(Calendar.YEAR)<fecha2.get(Calendar.YEAR)){
            return menor;
        }
        else{
            return mayor;
        }
    }

    public Calendar getMinimaFecha(){
        Calendar fecha=new GregorianCalendar(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
        
        Prestacion pre = SIRHApp.getInstance().getDAOPrestacion().getMinimaFecha();
        fecha.set(Calendar.DATE,pre.getFechaDeModificacion().get(Calendar.DATE));
        fecha.set(Calendar.MONTH,pre.getFechaDeModificacion().get(Calendar.MONTH));
        fecha.set(Calendar.YEAR,pre.getFechaDeModificacion().get(Calendar.YEAR));

        Empleado emp = SIRHApp.getInstance().getDAOEmpleado().getMinimaFecha();
        fecha.set(Calendar.DATE,emp.getFechaDeModificacion().get(Calendar.DATE));
        fecha.set(Calendar.MONTH,emp.getFechaDeModificacion().get(Calendar.MONTH));
        fecha.set(Calendar.YEAR,emp.getFechaDeModificacion().get(Calendar.YEAR));
        
        Cargo car = SIRHApp.getInstance().getDAOCargo().getMinimaFecha();
        fecha.set(Calendar.DATE,car.getFechaDeModificacion().get(Calendar.DATE));
        fecha.set(Calendar.MONTH,car.getFechaDeModificacion().get(Calendar.MONTH));
        fecha.set(Calendar.YEAR,car.getFechaDeModificacion().get(Calendar.YEAR));
        
        return fecha;
    }

    private int verificarQuincena(Calendar fecha){
        if(fecha.get(Calendar.DATE) <=15){
            return 1;
        }
        else{
            return 2;
        }
    }
    
    public Empleado getEmpMayorFecha(ArrayList<Empleado> cambios){
        
        Calendar cal = new GregorianCalendar(0,0,0);
        int index = -1;
        for(Empleado emp: cambios){
                       
            if(compararFecha(emp.getFechaDeModificacion(), cal)==mayor||
               compararFecha(emp.getFechaDeModificacion(), cal)==igual){
                cal.set(emp.getFechaDeModificacion().get(Calendar.YEAR), 
                        emp.getFechaDeModificacion().get(Calendar.MONTH),
                        emp.getFechaDeModificacion().get(Calendar.DATE));
                index+=1;
            }
        }
        
        return cambios.get(index);
    }
    
    public Cargo getCarMayorFecha(ArrayList<Cargo> cambios){
        int index=-1;
        Calendar cal = new GregorianCalendar(0,0,0);
        for(Cargo car: cambios){
            if(compararFecha(car.getFechaDeModificacion(), cal)==mayor){
                index+=1;
                cal.set(car.getFechaDeModificacion().get(Calendar.YEAR), 
                        car.getFechaDeModificacion().get(Calendar.MONTH),
                        car.getFechaDeModificacion().get(Calendar.DATE));
            }
        }
        return cambios.get(index);
    }
    
    public Prestacion getPresMayorFecha(ArrayList<Prestacion> cambios){
        int index=-1;
        Calendar cal = new GregorianCalendar(0,0,0);
        for(Prestacion car: cambios){
            if(compararFecha(car.getFechaDeModificacion(), cal)==mayor){
                index+=1;
                cal.set(car.getFechaDeModificacion().get(Calendar.YEAR), 
                        car.getFechaDeModificacion().get(Calendar.MONTH),
                        car.getFechaDeModificacion().get(Calendar.DATE));
            }
        }
        return cambios.get(index);
    }
    
    private int igual=0;
    private int mayor=1,menor=2;

}
